'''
Created on 18/09/2013

@author: Gonzalo
'''

class SwansonMegill(object):
    '''
    Esta clase implementa los metodos media y varianza para la distribucion
    de Swanson y Megill, con el mapeo de opt, pes y mediana visto en clase y
    la simplificacion al tomar los percentiles como porcentajes
    '''


    def __init__(self):
        pass
    
    def media(self, valor_pes, valor_opt=None, mediana=None):
        '''
        Devuelve la media. Tomamos el valor_pes segun el cono de Boehm 
        como el 100% de la distribucion y los percentiles los calculamos
        como porcentajes. De esta forma, segun la distribucion el valor optimista 
        es el percentil 10%, la mediana el 50% y el pesimista el 90%. 
        '''
        valor_opt = valor_pes*0.10
        mediana = valor_pes*0.5
        valor_pes = valor_pes*0.90
        return (0.3*valor_opt + 0.4*mediana + 0.3*valor_pes)
    
    def varianza(self, valor_pes, valor_opt=None, mediana=None):
        '''
        Devuelve la varianza. Tomamos el valor_pes segun el cono de Boehm 
        como el 100% de la distribucion y los percentiles los calculamos
        como porcentajes. De esta forma, segun la distribucion el valor optimista 
        es el percentil 10%, la mediana el 50% y el pesimista el 90%. 
        '''
        media = self.media(valor_pes, valor_opt, mediana)
        valor_opt = valor_pes*0.10
        mediana = valor_pes*0.5
        valor_pes = valor_pes*0.90
        return (0.3*(valor_opt-media)**2 + 0.4*(mediana-media)**2 + 0.3*(valor_pes - media)**2)